#!python3

import matplotlib.pyplot as plt
import numpy as np
from mpl_toolkits.mplot3d import Axes3D  # 动态图所需要的包


def numpy():
    # 将列表转换为数组
    lst = [1, 2, 3, 4]
    a = np.array(lst)
    print(a, a.size, a.shape, a.ndim, a.dtype, sep='\n')


def scatter():
    """
    散点图
    :return:
    """
    #  plt.scatter(X, Y, s=75, c=T, alpha=.5)
    # 其中X,Y分别为横纵坐标；s为点的大小（optional）；
    # c为颜色设置（optional）；alpha为透明度设置（optional），是一个小于等于1的值
    plt.scatter(0, 0, s=75, c=0, alpha=.5)
    plt.scatter(2, 2, s=75, c=0, alpha=.5)
    plt.scatter(5, 14, s=75, c=0, alpha=.5)

    # 图片附加信息
    plt.xlim((0, 10))  # 设置x轴范围为（0,10）
    plt.ylim((0, 15))  # 设置y轴范围为（0,15）
    plt.legend()  # 显示图例
    plt.show()  # 显示绘图


def bar():
    """
    柱状图
    :return:
    """
    x = np.arange(10)
    y = 2 ** x + 10
    print(x)
    print(y)

    plt.bar(x, y,
            facecolor='#9999ff',  # 柱颜色
            edgecolor='white'  # 柱边框颜色
            )
    for x, y in zip(x, y):  # zip指把x，y结合为一个整体，一次可以读取一个x和一个y
        plt.text(x, y, '%.2f' % y,
                 ha='center', va='bottom'  # 指字体在中间和柱最顶的顶部
                 )
    plt.show()


def f(x, y):
    # 用来生成高度
    return (1 - x / 2 + x ** 5 + y ** 3) * np.exp(-x ** 2 - y ** 2)


def contour():
    """
    等高线
    :return:
    """
    x = np.linspace(-3, 3, 100)
    y = np.linspace(-3, 3, 100)
    X, Y = np.meshgrid(x, y)  # 将x，y指传入网格中
    plt.contourf(X, Y, f(X, Y), 8, alpha=0.75, cmap=plt.cm.hot)  # 8指图中的8+1根线，绘制等温线，其中cmap指颜色
    C = plt.contour(X, Y, f(X, Y), 8, colors='black', linewidth=.5)  # colors指等高线颜色
    plt.clabel(C, inline=True, fontsize=10)  # inline=True指字体在等高线中
    plt.xticks(())
    plt.yticks(())
    plt.show()


def threeD():
    """
    3D图
    :return:
    """
    fig = plt.figure()
    ax = Axes3D(fig)
    x = np.arange(-4, 4, 0.25)  # 0.25指-4至4间隔为0.25
    y = np.arange(-4, 4, 0.25)
    X, Y = np.meshgrid(x, y)  # x，y放入网格
    R = np.sqrt(X ** 2 + Y ** 2)
    Z = np.sin(R)
    ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=plt.get_cmap('rainbow'))  # rstride=1指x方向和y方向的色块大小
    ax.contourf(X, Y, Z, zdir='z', offset=-2, cmap='rainbow')  # zdir指映射到z方向，-2代表映射到了z=-2
    ax.set_zlim(-2, -2)
    plt.show()


def subPlot():
    """
    子图像
    :return:
    """
    plt.figure()
    plt.subplot(2, 2, 1)  # 建立一个两行两列的画布，第一个
    plt.plot([0, 1], [0, 1])
    plt.subplot(2, 2, 2)  # 第二个
    plt.plot([0, 1], [0, 1])
    plt.subplot(2, 2, 3)  # 第三个
    plt.plot([0, 1], [0, 1])
    plt.subplot(2, 2, 4)  # 第四个
    plt.plot([0, 1], [0, 1])
    plt.show()


if __name__ == '__main__':
    # scatter()
    # bar()
    # contour()
    threeD()
    # subPlot()
